PIL
PIL
PIL(Python Imaging Library)은 파이썬에서 이미지 처리를 위한 대표적인 라이브러리로, 다양한 이미지 형식을 읽고, 수정하며 저장할 수 있는 기능을 제공합니다. 원래는 1990년대 후반 Fredrik Lundh에 의해 개발되었으며, 현재는 유지보수가 중단된 상태입니다. 그러나 PIL의 기능을 계승하고 개선한 Pillow라는 포크(fork) 프로젝트가 활발히 유지보수되고 있으며, 파이썬 커뮤니티에서 사실상 PIL이라고 하면 대부분 Pillow를 의미합니다.
이 문서에서는 PIL(Pillow)의 기본 개념, 주요 기능, 설치 방법, 활용 예시 및 주의사항을 다룹니다.
개요
PIL은 파이썬 기반의 이미지 조작을 위한 강력한 도구로, 간단한 작업부터 복잡한 이미지 변환까지 다양한 작업을 수행할 수 있습니다. 이미지 리사이징, 회전, 필터 적용, 색상 변환, 텍스트 삽입 등 기본적인 작업부터, NumPy와 연동하여 머신러닝, 컴퓨터 비전 분야에서도 널리 사용됩니다.
설치 및 환경 설정
PIL은 원본 라이브러리가 더 이상 업데이트되지 않기 때문에, Pillow를 설치하여 사용하는 것이 일반적입니다.
pip install Pillow
설치 후 파이썬 코드에서 다음과 같이 임포트합니다:
from PIL import Image
참고: Pillow는 PIL과 호환되며, 대부분의 코드에서 PIL을 사용하던 방식 그대로 사용할 수 있습니다.
주요 기능
1. 이미지 열기 및 저장
가장 기본적인 기능은 파일에서 이미지를 열고, 처리한 후 저장하는 것입니다.
from PIL import Image
# 이미지 열기
img = Image.open('example.jpg')
# 이미지 저장 (다른 형식으로도 가능)
img.save('output.png', 'PNG')
지원 형식: JPEG, PNG, BMP, GIF, TIFF, PPM 등 수십 가지.
2. 이미지 크기 조정 및 회전
이미지의 크기를 변경하거나 회전하는 작업은 자주 사용됩니다.
# 크기 조정
resized_img = img.resize((800, 600))
# 회전 (각도 기준)
rotated_img = img.rotate(45)
# 보간법을 사용해 품질 유지
resized_smooth = img.resize((800, 600), Image.Resampling.LANCZOS)
Image.Resampling은 Pillow 10.0.0 이상 버전에서 기존
Image.ANTIALIAS
를 대체한 상수입니다.
3. 색상 및 모드 변환
이미지의 색상 모드를 변경할 수 있습니다. 예를 들어 RGB에서 흑백(그레이스케일)로 변환:
gray_img = img.convert('L') # 'L'은 그레이스케일 모드
기타 모드: '[RGB](/doc/%EA%B8%B0%EC%88%A0/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EC%B2%98%EB%A6%AC/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EB%AA%A8%EB%93%9C/RGB)'
, '[RGBA](/doc/%EA%B8%B0%EC%88%A0/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EC%B2%98%EB%A6%AC/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EB%AA%A8%EB%93%9C/RGBA)'
(투명도 포함), '[CMYK](/doc/%EA%B8%B0%EC%88%A0/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EC%B2%98%EB%A6%AC/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EB%AA%A8%EB%93%9C/CMYK)'
, '[HSV](/doc/%EA%B8%B0%EC%88%A0/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EC%B2%98%EB%A6%AC/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EB%AA%A8%EB%93%9C/HSV)'
등.
4. 이미지 자르기 및 붙여넣기
특정 영역을 자르거나, 다른 이미지 위에 합성할 수 있습니다.
# (x1, y1, x2, y2) 영역 자르기
cropped = img.crop((100, 100, 400, 400))
# 다른 이미지에 붙여넣기
img.paste(cropped, (50, 50))
5. 필터 및 효과 적용
Pillow는 ImageFilter
모듈을 통해 다양한 필터를 제공합니다.
from PIL import ImageFilter
# 블러
blurred = img.filter(ImageFilter.BLUR)
# 윤곽선 강조
edges = img.filter(ImageFilter.FIND_EDGES)
# 샤프닝
sharpened = img.filter(ImageFilter.SHARPEN)
6. 이미지 정보 및 메타데이터
이미지의 크기, 포맷, 색상 모드 등을 확인할 수 있습니다.
print(f"크기: {img.size}")
print(f"포맷: {img.format}")
print(f"모드: {img.mode}")
EXIF 정보(카메라 모델, 촬영 시간 등)도 일부 지원됩니다.
exif = img._getexif()
활용 예시: 간단한 배치 처리
다음은 여러 이미지를 한 번에 리사이징하고 저장하는 스크립트 예시입니다.
import os
from PIL import Image
input_dir = 'images/'
output_dir = 'resized/'
os.makedirs(output_dir, exist_ok=True)
for filename in os.listdir(input_dir):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
img_path = os.path.join(input_dir, filename)
Image.open(img_path) as img:
resized = img.resize((640, 480))
save_path = os.path.join(output_dir, filename)
resized.save(save_path, 'JPEG')
한계 및 주의사항
- 성능: Pillow는단한 이미지 처리에는 적합하지만, 대용량 이미지나 실시간 처리에는 NumPy + OpenCV 조합이 더 효율적일 수 있습니다.
- 메모리 사용: 큰 이미지를 처리할 때 메모리 소모가 클 수 있으므로,
Image.open()
후에는 필요 시img.close()
호출 권장. - EXIF 회전 문제: 일부 JPEG 이미지는 EXIF 회전 정보를 포함하고 있으므로,
[ImageOps.exif_transpose](/doc/%EA%B8%B0%EC%88%A0/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EC%B2%98%EB%A6%AC/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EB%B3%B4%EC%A0%95/ImageOps.exif_transpose)()
를 사용해 올바른 방향으로 보정해야 할 수 있습니다.
from PIL import ImageOps
img = ImageOps.exif_transpose(img)
관련 라이브러리 및 통합
- NumPy:
numpy.array(img)
로 PIL 이미지를 배열로 변환 가능. - OpenCV:
cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
로 호환. - Matplotlib:
plt.imshow(img)
로 이미지 시각화 가능.
참고 자료
Pillow는 파이썬 이미지 처리의 핵심 도구로, 초보자부터 전문가까지 폭넓게 활용할 수 있습니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.